#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# blipoc - Blip On Console
#
# author: Cezary Statkiewicz (cezio [at] thelirium.net), Patryk Zawadzki <patrys@pld-linux.org>
# website: http://code.google.com/p/blipoc/
#
# version: $Id$

import ConfigParser, optparse, cPickle, os
import curses
import blipy, blipy.core
from pblipoc.app import CommandDispatcher, set_status, dashboard, BlipocApp

from pprint import pprint
import sys, datetime


def subscriptions_cli_callback(option, opt_str, value, parser):
    if parser.rargs and not parser.rargs[0].startswith('-'):
        parser.values.subscriptions = parser.rargs.pop(0)
    else:
        parser.values.subscriptions = True

def empty_str(val=None):
    if val:
        return '%s'%val
    return
if __name__ == '__main__':
    ### CLI setup
    usage = """Blipoc - Blip.pl on console - version %s $Id$
    """%blipy.core.API_VERSION
    cli_parser = optparse.OptionParser( version = 'blipoc version %s $Id$'%blipy.core.API_VERSION)
    cli_parser.set_usage(usage)
    cli_parser.add_option( '-u', '--user', type='string', dest='username',  help=u'Nazwa użytkownika')
    cli_parser.add_option( '-U', '', type='string', dest='user', help=u'ID lub login użytkownika, o którym chcesz pobrać informacje')
    cli_parser.add_option( '-p', '--password', type='string', dest='password',  help=u'Hasło użytkownika')
    cli_parser.add_option( '-i', '--interactive', action='store_true', dest='interactive', help=u'Uruchom w trybie interaktywnym')
    cli_parser.add_option( '', '--ignore', dest='ignore', help=u'Ustaw listę ignorowanych blipowiczów')
    cli_parser.add_option( '', '--debug', action='store_true', dest='debug', help=u'Pokazuj informacje debugowe (domyślnie: tak)')
    cli_parser.add_option( '', '--no-debug', action='store_false', dest='debug', help=u'Nie pokazuj informacji debugowych')
    cli_parser.add_option( '-b', '--bliposphere', action='store_true', dest='bliposphere', help=u'Bliposfera')
    cli_parser.add_option( '-t', '--tag', dest='tag', help=u'Lista statuow z tagu')
    cli_parser.add_option( '-s', '--set', type='string', dest='set_status', help=u'Ustawia status')
    cli_parser.add_option( '-P', '--picture', type='string', dest='picture', help=u'Obrazek do załadowania przy ustawianiu statusu')
    cli_parser.add_option( '-f', '--friends', action='store_true', dest='friends', help=u'Pobierz listę przyjaciół')
    cli_parser.add_option( '--add-friend', dest='add_friend', help=u'Dodaj użytkownika do listy obserwowanych')
    cli_parser.add_option( '--del-friend', dest='del_friend', help=u'Usuń użytkownika z listy obserwowanych')
    cli_parser.add_option( '--subscriptions', action='callback', help=u'Pokaż subskrypcje użytkownika', callback=subscriptions_cli_callback)
    cli_parser.add_option( '-d', '--dashboard', type='int', dest='dashboard', help=u'Pobierz dashboard od statusu o podanym id')
    cli_parser.add_option( '-g', '--get', type='string', dest='get_status', help=u'Pobierz dany status')
    cli_parser.add_option( '-e', '--encoding', type='string', dest='encoding', help=u'Kodowanie znaków wprowadzanych na konsoli (domyślne utf-8)')
    
    
    # mark for cli setup
    CLI_SETUP = False
    CFG_SETUP = False
    SETTINGS_FILE = '~/.blipoc/settings.cfg'
    
    if len(sys.argv)>1:
        options, args = cli_parser.parse_args()
        CLI_SETUP = True
    
    ### end CLI setup
    ### .ini setup
    
    if os.path.exists( os.path.expanduser(SETTINGS_FILE) ):
        config = ConfigParser.ConfigParser()
        config.read(os.path.expanduser(SETTINGS_FILE))
        CFG_SETUP = True
    else:
        try:
            os.makedirs( os.path.dirname(os.path.expanduser(SETTINGS_FILE)))
        except OSError:
            pass
        
    # .ini <-> cli options mapping dict
    # first key - section in .ini
    #   list item - cli options property
    
    _mapping = {'user': ['username', 'password']
                ,
                'settings': ['interactive', 'encoding', 'debug']}
#               'data': []}
    if CLI_SETUP:
        if CFG_SETUP:
            for k in _mapping:
                for subk in _mapping[k]:
                    if getattr(options, subk, None):
                        if not config.has_section(k):
                            config.add_section(k)
                        config.set(k, subk, getattr(options,subk) or '')
    
        else:
            config = ConfigParser.ConfigParser()
            for k in _mapping:
                config.add_section(k)
                for subk in _mapping[k]:
                    config.set(k, subk, getattr(options, subk) or '')
            CFG_SETUP = True
            
    if CFG_SETUP:
        config.write(open(  os.path.expanduser(SETTINGS_FILE), 'w' ))
        blipy.core.DEBUG = config.getboolean('settings', 'debug')

    ### end .ini setup 

    ### non-interactive ###
    commands = CommandDispatcher()
        
    if CLI_SETUP and not getattr(options, 'interactive', False) :
        commands.parse_commands(options, config)
        commands.run()

    elif CLI_SETUP and getattr(options, 'interactive', False):
        app = BlipocApp(commands)
        
        app.run()
        #
        
    elif CFG_SETUP:
        commands.install_command(dashboard, None, config)
        commands.run()
    else:
        sys.exit('How did you do that?')
